package com.jungle.system.utils.oss;

import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jungle.common.config.properties.SshSftpProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.UUID;

@Component
@RequiredArgsConstructor
public class FileImportUtil {

    private final SshSftpProperties sftpProperties;

    /**
     * 利用JSch包实现SFTP上传文件
     *
     * @param bytes    文件字节流
     * @param fileName 文件名
     * @return 在服务器中文件所处路径
     * @throws Exception
     */
    public String uploadFile(byte[] bytes, String fileName) throws Exception {
        //连接服务器
        Session session = getSession();
        //打开sftp通信通道
        ChannelSftp sftp = getChannelSftp(session);

        sftp.connect();
        //进入服务器指定的文件夹
        sftp.cd(sftpProperties.getPath());

        //获取一个唯一文件名
        String newFileName = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));

        //以下代码实现从本地上传一个文件到服务器，如果要实现下载，对换以下流就可以了
        OutputStream outstream = sftp.put(newFileName);
        outstream.write(bytes);
        //关流操作
        if (outstream != null) {
            outstream.flush();
            outstream.close();
        }
        if (session != null) {
            session.disconnect();
        }
        return sftpProperties.getPath() + newFileName;
    }

    /**
     * 下载文件
     * @return
     * @throws Exception
     */
    public String downloadFile(String filePath) throws Exception {
        //连接服务器
        Session session = getSession();
        //打开sftp通信通道
        ChannelSftp sftp = getChannelSftp(session);

        sftp.connect();
        //进入服务器指定的文件夹
        sftp.cd(sftpProperties.getPath());

        InputStream inputStream = sftp.get(filePath);
        //关流操作
        if (inputStream != null) {
            inputStream.close();
        }
        if (session != null) {
            session.disconnect();
        }
        return sftpProperties.getPath();
    }
    private ChannelSftp getChannelSftp(Session session) throws JSchException {
        //设置登陆主机的密码
        session.setPassword(sftpProperties.getPassword());//设置密码
        Properties config = new Properties();
        //设置第一次登陆的时候提示，可选值：(ask | yes | no)
        config.put("StrictHostKeyChecking" , "no");
        session.setConfig(config);
        //设置登陆超时时间
        session.connect(30000);

        //创建sftp通信通道    (Channel)
        return (ChannelSftp) session.openChannel("sftp");
    }

    private Session getSession() throws Exception {
        String ip = sftpProperties.getIp();
        String user = sftpProperties.getUser();
        int port = sftpProperties.getPort();

        // 打开 JSch 调试模式
        JSch jsch = new JSch();

        //连接服务器，采用指定的端口连接服务器
        Session session = port <= 0 ? jsch.getSession(user, ip) : jsch.getSession(user, ip, port);

        //如果服务器连接不上，则抛出异常
        if (session == null) {
            throw new Exception("session is null");
        }
        return session;
    }
}


